export function params() {
  const BITS = (...ar) => {
    let r = ar.reverse()
    return (v) => r.map(i => {
      let t = v & (0x0FFFF >> (16 - i));
      v >>= i;
      return t
    }).reverse()
  }
  const F01 = (v, n) => {
    let V = 5 * v / 2 ** 12
    return V
  }
  const F02 = (v, n) => {
    let V = 5 * v / 2 ** 12
    let I = 0.5 * V
    return I
  }
  const F03 = (v, n) => {
//        RT = (10000*(5*v/2**12)/(5-(5*v/2**12)))
//        B = 4100000
//        T1 = 25
//        R1 = 5000
//        T = B * T1 / (B - (T1*Math.log(R1/RT)))
    let T = 1 / ((1 / 4100) * Math.log(2 * v / (4096 - v)) + (1 / 298.15)) - 273.15
    return T
  }
  const F04 = (v, n) => {
    let REF = 2.5
    let num = 12
    let V = 2 * REF * v / 2 ** num
    return V
  }
  const F05 = (v, n) => {
    let t = v * 0.04
    return t
  }
  const F06 = (v, n) => {
    let num = 12
    let Vt = 5 * v / 2 ** num
    let T = 0.0422 * Vt ** 3 - 0.2795 * Vt ** 2 + 6.4895 * Vt + 10.302
    return T
  }
  const F07 = (v, n) => {
    if ((v & 0xA500) === 0xA500) return 'TGA工作温度为:' + (v & 0x00FF).toString(10)
    else if ((v & 0xA400) === 0xA400) return '制冷器占空比为:' + (v & 0x00FF).toString(10)
    else if ((v & 0xA300) === 0xA300) return '加热占空比为:' + (v & 0x00FF).toString(10)
    else if ((v & 0xA200) === 0xA200) return '正常工作模式'
    else if ((v & 0xA100) === 0xA100) return '自检工作模式（上电默认）'
  }
  const F08 = (v, n) => {
    let V = 5 * v / 4096
    return V
  }
  const F09 = (v, n) => {
    let REF = 2.5
    let num = 12
    let V = 2 * 2 * REF * v / 2 ** num
    return V

  }
  const D01 = {
    0xA5: '自检模式',
    0x5A: '探测模式'
  }
  const D02 = {
    0x00: '防尘盖关闭状态',
    0xFF: '防尘盖打开状态'
  }
  const D03 = {
    0x00: '不出光',
    0xFF: '出光'
  }
  const D04 = {
    0b0000: '正常',
    0b0001: '开路故障',
    0b0010: '短路故障',
    0b0011: '过流'
  }
  const D05 = {
    0b0100: '1通道关闭',
    0b0101: '1通道打开',
    0b1000: '2通道关闭',
    0b1001: '2通道打开'
  }
  const D06 = {
    0b00: 'PGA增益=1',
    0b01: 'PGA增益=1.2',
    0b10: 'PGA增益=1.4',
    0b11: 'PGA增益=1.6'
  }
  const D07 = {
    0xA1A1: '自检工作模式（上电默认）',
    0xA2A2: '正常工作模式',
    0xA3A3: 'SH1静默，SH2工作',
    0xA4A4: 'SH2静默，SH1工作',
    0xA5A5: '传感器全部静默',
    0xA6A6: '预留'
  }
  const D08 = {
    0x01: '每天1张（开机默认值）',
    0x02: '每天2张',
    0x04: '每天4张',
    0x08: '每天8张'
  }
  const D09 = {
    0xBB: '125kHz调制',
    0xAA: '25kHz调制'
  }
  const D10 = {
    0x00: '无接收错误',
    0xA1: '奇偶校验错误',
    0xA2: '停止位错误',
    0xA3: '字符间隔错误',
    0xB1: '命令类型错误',
    0xB2: '指令长度错误',
    0xB3: '校验和错误'
  }
        const TD01=(v)=>{
      // d: 时区为北京时的时候， 转换最终时间 需要减去offset 方可用 toISO 方法显示为北京时 - t.getTimezoneOffset()*60e3
      // 	  // d 指定时区为utc / toiso 也是utc 也就是与开始时间处于同一时区，处理过程就不需要在考虑时区问题了
       	        let d = new Date('2020-01-01T00:00:00Z')
       	        let t = parseInt(v.toString(16).padStart(12,0).slice(0,8),16)*1000 + (v & 0xFFFF)  + d.getTime()
       	        return new Date(t).toISOString().slice(0,23).replace('T',' ')
       	                        }
  return [
//        1			包同步码		16			0xEB90
    new Params('a001', '包同步码', 16, null, null, null, null),
//2			包标识		16			0x0A19
    new Params('a002', '包标识', 16, null, null, null, null),
//3			包序		16
    new Params('a003', '包序', 16, null, null, null, null),
//4			包长		16			0x4F
    new Params('a004', '包长', 16, null, null, null, null),
//5			副导头（时间码）		48		源码
    new Params('a005', '副导头（时间码）', 48, null, v=>TD01(v), null, null),
//6			命令类型		8			0x25
    new Params('a006', '命令类型', 8, null, null, null, null),
//7			尘埃模块工作模式	无	8		表格	十六进制解析: 0x5A（探测模式），0xA5（自检模式）	0xA5	0x5A	0xA5	0x5A	2s/次
    new Params('a007', '尘埃模块工作模式', 8, null, null, v => D01[v], v => v <= 0xA5 && v >= 0x5A),
//8			尘埃模块注入指令错误接收计数	无	8		表格	十六进制解析	无	无	无	无	2s/次
    new Params('a008', '尘埃模块注入指令错误接收计数', 8, null, null, null, null),
//9			尘埃模块注入指令正确接收计数	无	16		表格	十六进制解析	无	无	无	无	2s/次
    new Params('a009', '尘埃模块注入指令正确接收计数', 16, null, null, null, null),
//10			尘埃模块注入指令执行计数	无	16		表格	十六进制解析	无	无	无	无	2s/次
    new Params('a010', '尘埃模块注入指令执行计数', 16, null, null, null, null),
//11			尘埃模块注入指令转发计数	无	8		表格	十六进制解析	无	无	无	无	2s/次
    new Params('a011', '尘埃模块注入指令转发计数', 8, null, null, null, null),
//12			尘埃模块防尘盖开合状态	无	8		表格	0x00:防尘盖关闭状态
//0xFF:防尘盖打开状态	无	无	无	无	2s/次
    new Params('a012', '尘埃模块防尘盖开合状态', 8, null, null, v => D02[v], null),
//13			尘埃模块+15V电压遥测参数	V	16		表格、曲线	按公式解析 注1	2.8V	2.2V	2.8V	2.2V	2s/次
    new Params('a013', '尘埃模块+15V电压遥测参数', 16, 'V', v => F01(v, 'a012'), v => v.toFixed(3), v => v <= 2.8 && v >= 2.2),
//14			尘埃模块激光管输出状态	无	8		表格	十六进制解析:0x00（不出光），0xFF（出光）	无	无	无	无	2s/次
    new Params('a014', '尘埃模块激光管输出状态', 8, null, null, v => D03[v], null),
//15			尘埃模块微型相机LED状态	无	8		表格	按bit解析:
//高4位标识故障
//[b7..b4]=0000；正常
//[b7..b4]=0001；开路故障
//[b7..b4]=0010；短路故障
//[b7..b4]=0011；过流
//低4位标识当前通道及点亮状态
//[b3..b0]=0100；1通道，关闭
//[b3..b0]=0101；1通道，打开
//[b3..b0]=1000；2通道，关闭
//[b3..b0]=1001；2通道，打开	无	无	无	无	2s/次
    new Params('a015', '尘埃模块微型相机LED状态', 8, null, BITS(4, 4), v => `故障:${D04[v[0]]} 当前通道及点亮状态:${D05[v[1]]}`, null),
//16			尘埃模块激光管LD电流遥测	A	16		表格、曲线	按公式解析 注2	无	无	4V	无	2s/次
    new Params('a016', '尘埃模块激光管LD电流遥测', 16, 'A', v => F02(v, 'a016'), v => v.toFixed(2), v => v <= 4),
//17			尘埃模块VISTA单元顶板温度遥测	℃	16		表格、曲线	按公式解析 注3	无	无	无	无	2s/次
    new Params('a017', '尘埃模块VISTA单元顶板温度遥测', 16, '℃', v => F03(v, 'a017'), v => v.toFixed(3), null),
//18			动量测量单元L增益通道触发阈值	V	16		表格	按公式解析 注4	10V	0V	10	0	2s/次
    new Params('a018', '动量测量单元L增益通道触发阈值', 16, 'V', v => F04(v, 'a018'), v => v.toFixed(3), v => v <= 10 && v >= 0),
//19			动量测量单元H增益通道触发阈值	V	16		表格	按公式解析 注5	5V	0V	5	0	2s/次
    new Params('a019', '动量测量单元H增益通道触发阈值', 16, 'V', v => F04(v, 'a019'), v => v.toFixed(3), v => v <= 5 && v >= 0),
//        20			动量测量单元自检信号幅度	V	16		表格	按公式解析 注6	10V	0V	10	0	2s/次
    new Params('a020', '动量测量单元自检信号幅度', 16, 'V', v => F09(v, 'a020'), v => v.toFixed(3), v => v <= 10 && v >= 0),
//21			动量测量单元自检信号脉冲宽度	μs	16		表格	按公式解析 注7	无	无	无	无	2s/次
    new Params('a021', '动量测量单元自检信号脉冲宽度', 16, 'μs', v => F05(v, 'a021'), v => v.toFixed(3), null),
//22			粒径测量1st触发阈值	无	24		表格	按十进制解析	无	无	无	无	2s/次
    new Params('a022', '粒径测量1st触发阈值', 24, null, null, null, null),
//23			粒径测量2nd触发阈值	无	24		表格	按十进制解析	无	无	无	无	2s/次
    new Params('a023', '粒径测量2nd触发阈值', 24, null, null, null, null),
//24			粒径测量3rd触发阈值	无	24		表格	按十进制解析	无	无	无	无	2s/次
    new Params('a024', '粒径测量3rd触发阈值', 24, null, null, null, null),
//25			激光管LD温度遥测	℃	16		表格、曲线	按公式解析 注8	无	无	无	无	2s/次
    new Params('a025', '激光管LD温度遥测', 16, '℃', v => F06(v, 'a025'), v => v.toFixed(3), null),
//26			单粒子锁定事件次数	次	8		表格、曲线	按十进制解析	无	无	无	无	2s/次
    new Params('a026', '单粒子锁定事件次数', 8, null, null, null, null),
//27			微型相机PGA增益	无	8		表格	按bit解析（低2位）:
//[1:0]=00；PGA增益=1
//[1:0]=01；PGA增益=1.2
//[1:0]=10；PGA增益=1.4
//[1:0]=11；PGA增益=1.6	无	无	无	无	2s/次
    new Params('a027', '微型相机PGA增益', 8, null, null, v => D06[v & 0b00000011], null),
//28			微型相机ADC增益	无	8		表格	按十进制解析	63	0	无	无	2s/次/
    new Params('a028', '微型相机ADC增益', 8, null, null, null, null),
//29			微型相机当前曝光时间	ms	16		表格	按十进制解析	1000	1	无	无	2s/次
    new Params('a029', '微型相机当前曝光时间', 16, 'ms', null, null, null),
//30			VISTA SH1工作参数	无	16		表格	A1A1:自检工作模式（上电默认）
//A2A2:正常工作模式
//A3**:加热占空比为**
//A4**:制冷器占空比为**
//A5**: TGA工作温度为**	无	无	无	无	2s/次
    new Params('a030', 'VISTA SH1工作参数', 16, null, v => F07(v, 'a030'), null, null),
//31			VISTA SH2工作参数	无	16		表格	A1A1:自检工作模式（上电默认）
//A2A2:正常工作模式
//A3**:加热占空比为**
//A5**:TGA工作温度为**	无	无	无	无	2s/次
    new Params('a031', 'VISTA SH2工作参数', 16, null, v => F07(v, 'a031'), null, null),
//32			VISTA MU工作状态遥测	无	16		表格	A1A1:自检工作模式（上电默认）
//A2A2:正常工作模式
//A3A3:SH1静默，SH2工作
//A4A4:SH2静默，SH1工作
//A5A5:传感器全部静默
//A6A6:预留	无	无	无	无	2s/次
    new Params('a032', 'VISTA MU工作状态遥测', 16, null, null, v => D07[v], null),
//33			粒径通道1st底噪	无	24		表格	十进制解析	无	无	无	无	2s/次
    new Params('a033', '粒径通道1st底噪', 24, null, null, null, null),
//34			粒径通道2nd底噪	无	24		表格	十进制解析	无	无	无	无	2s/次
    new Params('a034', '粒径通道2nd底噪', 24, null, null, null, null),
//35			粒径通道3rd底噪	无	24		表格	十进制解析	无	无	无	无	2s/次
    new Params('a035', '粒径通道3rd底噪', 24, null, null, null, null),
//36			微型相机图片每天拍摄次数	无	8			0x01:每天1张（开机默认值）
//0x02:每天2张
//0x04:每天4张
//0x08:每天8张	无	无	无	无	2s/次
    new Params('a036', '微型相机图片每天拍摄次数', 8, null, null, v => D08[v], null),
//37			ADS8681过流重启电压阈值	V	16		表格	按公式解析 注9	无	无	无	无	2s/次
    new Params('a037', 'ADS8681过流重启电压阈值', 16, 'V', v => F08(v, 'a036'), v=>v.toFixed(3), null),
//        38			激光调制模式	无	8		表格	十六进制解析 AA：25kHz调制，BB：125kHz调制	BB	AA	BB	AA	2s/次
    new Params('a038', '激光调制模式', 8, null, null, v => D09[v], v => v <= 0xBB && v >= 0xAA),
//39			尘埃模块指令接收错误类型	无	8		表格	十六进制解析
//1Byte参数含义：
//00（无接收错误）
//A1（奇偶校验错误）
//A2（停止位错误）
//A3（字符间隔错误）
//B1（命令类型错误）
//B2（指令长度错误）
//B3（校验和错误）
//当同时发生2个及以上的错误，以高优先级的错误进行反馈，优先级如下：
//1.奇偶校验错误
//2.停止位错误
//3.命令类型错误
//4.指令长度错误
//5.校验和错误
//6.字符间隔错误	无	无	无	无	2s/次
    new Params('a039', '尘埃模块指令接收错误类型', 8, null, null, v => D10[v], null),
//40			图像传感器单粒子锁定防护电流当前阈值	mA	16		表格	十进制解析	无	无	无	无	2s/次
    new Params('a040', '图像传感器单粒子锁定防护电流当前阈值', 16, 'mA', null, null, null),
//41			预留	无	16		表格	填充0x0000	无	无	无	无	2s/次
    new Params('a041', '预留', 16, null, null, null, null),
//42			校验和	无	8
    new Params('a042', '校验和', 8, null, null, null, null),
  ]


}
